package com.ht.api.util;

import com.ht.api.bean.UserInfo;
import com.ht.api.constant.CacheConstants;
import com.ht.api.db.exception.HtException;
import com.ht.api.db.util.RedisUtil;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import jakarta.servlet.http.HttpServletRequest;

/**
 * 用户工具类
 * @author asq
 * @createTime 2024年12月21日 18:32:02
 */
public class UserUtil {
	/** 存储当前登陆用户 */
	private static final ThreadLocal<UserInfo> USER_HOLDER = new ThreadLocal<>();

	/**
	 * 设置当前登录用户
	 */
	public static void setLoginUser(UserInfo user) {
		USER_HOLDER.set(user);
	}

	/**
	 * 获取当前登录用户
	 */
	public static UserInfo getLoginUser() {
		UserInfo user = USER_HOLDER.get();
		if (user == null) {
			throw new HtException("获取登陆用户信息异常");
		}
		return user;
	}

	/**
	 * 清除当前登录用户
	 */
	public static void clear() {
		USER_HOLDER.remove();
	}

	/**
	 * 获取登录用户
	 * @param req
	 * @return
	 */
	public static UserInfo getUserInfo(HttpServletRequest req) {
		String token = req.getHeader(JwtUtils.TOKEN_KEY);
		if (token == null || token.isEmpty()) {
			token = req.getParameter(JwtUtils.TOKEN_KEY);
		}
		if (token == null) {
			return null;
		}
		String username = JwtUtils.getUsername(token);
		if (username == null) {
			return null;
		}
		String key = CacheConstants.KEY_USER + username;
		String json = RedisUtil.get(key);
		if (StrUtil.isBlank(json)) {
			return null;
		}
		return JSONUtil.toBean(json, UserInfo.class);
	}
}
